package com.xiaoli.computertest;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import bsh.EvalError;
import bsh.Interpreter;

/**
 * @author shelly
 *
 */
public class ComputertestActivity extends Activity {

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        init();
    }
    
    private void init() {
    	setListener();
	}

	private void setListener(){
    	final EditText editText = (EditText)findViewById(R.id.number_input);
		((Button)findViewById(R.id.b_0)).setOnClickListener(buildAlgebraHandler(editText,"0"));
    	((Button)findViewById(R.id.b_1)).setOnClickListener(buildAlgebraHandler(editText,"1"));
    	((Button)findViewById(R.id.b_2)).setOnClickListener(buildAlgebraHandler(editText,"2"));
    	((Button)findViewById(R.id.b_3)).setOnClickListener(buildAlgebraHandler(editText,"3"));
    	((Button)findViewById(R.id.b_4)).setOnClickListener(buildAlgebraHandler(editText,"4"));
    	((Button)findViewById(R.id.b_5)).setOnClickListener(buildAlgebraHandler(editText,"5"));
    	((Button)findViewById(R.id.b_6)).setOnClickListener(buildAlgebraHandler(editText,"6"));
    	((Button)findViewById(R.id.b_7)).setOnClickListener(buildAlgebraHandler(editText,"7"));
    	((Button)findViewById(R.id.b_8)).setOnClickListener(buildAlgebraHandler(editText,"8"));
    	((Button)findViewById(R.id.b_9)).setOnClickListener(buildAlgebraHandler(editText,"9"));
    	((Button)findViewById(R.id.b_point)).setOnClickListener(buildPointHandler(editText,"."));
    	((Button)findViewById(R.id.b_add)).setOnClickListener(buildSignHandler(editText,"+"));
    	((Button)findViewById(R.id.b_sub)).setOnClickListener(buildSignHandler(editText,"-"));
    	((Button)findViewById(R.id.b_ride)).setOnClickListener(buildSignHandler(editText,"*"));
    	((Button)findViewById(R.id.b_division)).setOnClickListener(buildSignHandler(editText,"/"));
    	
    	//不需要使用MVC的模式去重构，真正应该用的是 命令模式
    	//打开引入的第三方包 bsh-2.0b4 中的脚本引擎
    	//以后如果真正要投产，应该自己定制自己的脚本引擎来处理计算。
    	final Interpreter i = new Interpreter(); 
    	((Button)findViewById(R.id.b_equal)).setOnClickListener(buildEqualHandler(editText, i));
    	
    	((Button)findViewById(R.id.clear)).setOnClickListener(buildClearHandler(editText));
    }

	private OnClickListener buildClearHandler(final EditText editText) {
		return new OnClickListener() {
			public void onClick(View v) {
		    	String text = editText.getText().toString();
		    	editText.setSelection(text.length());//将光标定位在最后一个字符后面
				int end = text.length()-1;
				String substring="";
				//最后一个字符永远是特殊情况，要分情况处理
				if(end>0){
					substring = text.substring(0,end);
					editText.setText(substring);
					editText.setSelection(end);								
				}else if(end==0){
					//清除最后一个字符
					editText.setText("");
					editText.setSelection(0);	
				}
				//尚没有完成，设置为灰了以后，要能设置成正常。
				//设置成正常不要再这里面做，应该在别的按钮里面做
				if(text.isEmpty()){
					v.setEnabled(false);
				}
			}
			
		};
	}

	private OnClickListener buildEqualHandler(final EditText editText,
			final Interpreter i) {
		return new OnClickListener() {
			public void onClick(View v) {
				String expr = editText.getText().toString();
				Object eval = null;
				try {
					//使用脚本引擎直接计算表达式 
					eval = i.eval(expr);
				} catch (EvalError e) {
					editText.setText(e.getMessage());
					return ;
				}
				editText.setText(eval.toString());
			}
		};
	}

	private OnClickListener buildAlgebraHandler(final EditText editText, final String i) {
		return new OnClickListener() {
			public void onClick(View v) {
				editText.append(i);
				setClearEnable();
			}
		};
	}
	
	private OnClickListener buildPointHandler(final EditText editText, final String i) {
		return new OnClickListener() {
			public void onClick(View v) {
				String text = editText.getText().toString();
				if(text.length()<=0)
					return;
				char lastChar = text.charAt(text.length()-1);	
				if(lastChar=='+'||lastChar=='-'||lastChar=='*'||lastChar=='/'){
					
				}else if(lastChar=='.'){
					return;	
				}else{
					int tempInt = text.length()-1;
					char tempChar = text.charAt(text.length()-1);
					int pointNum = 0;
					while(tempChar!='+'&&tempChar!='-'&&tempChar!='*'&&tempChar!='/'&&tempInt>0&&pointNum==0){
						if(tempChar == '.')
							pointNum++;
						tempInt--;
						tempChar = text.charAt(tempInt);
					}
					if(pointNum>=1)
						return;
				}
//				if(text.charAt(0)=='.')				
//					text.charAt(1,text.length()-2)!='.';
//				else if((text.charAt(0)!='.')){
//					text.cha
//					
//				}
//					buildAlgebraHandler(editText, i);	为什么不需调用这个方法，而可以直接	editText.append(i);	？					
				editText.append(i);
				setClearEnable();
			}	
		};
	}
	
	private OnClickListener buildSignHandler(final EditText editText, final String i) {
		return new OnClickListener() {
			public void onClick(View v) {
				String text = editText.getText().toString();
				if(text.length()<=0)
					return;
				char lastChar = text.charAt(text.length()-1);
				if(lastChar=='+'||lastChar=='-'||lastChar=='*'||lastChar=='/')
					return;
				
				editText.append(i);
				setClearEnable();
			}
		};
	}
	
	private void setClearEnable() {
		findViewById(R.id.clear).setEnabled(true);
	}
}